package de.fhffm.gaertnerei.tabellenModelle;
/**
 * @author Julian Schmücker
 */

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.table.AbstractTableModel;

import de.fhffm.gaertnerei.tabellen.Art;
import de.fhffm.gaertnerei.tabellen.Farbe;
import de.fhffm.gaertnerei.tabellen.Herkunft;
import de.fhffm.gaertnerei.tabellen.Pflanze;
import de.fhffm.gaertnerei.tabellen.Schaerfegrad;

@SuppressWarnings("serial")
public class PflanzeTableModel extends AbstractTableModel {

	private EntityManager manager = Persistence.createEntityManagerFactory("chilidatenbank").createEntityManager(); 
	private int startPosition;
	private List<Pflanze> pflanzenListe;
	
	public PflanzeTableModel(){
		
		this.startPosition = 0;
		// hohle alle Pflanzen zwischen 0 und 100
		this.pflanzenListe = getItems(startPosition, startPosition+100);
		
	}

	@Override
	public int getRowCount() {
		// gibt Zeilenanzahl als Long wert zurück
		return ((Long) manager.createQuery("SELECT COUNT(c) FROM Pflanze c").getSingleResult()).intValue();
	}

	@Override
	public int getColumnCount() {
		return 8;
	}
	
    public String getColumnName(int spalte) {
        
    	switch(spalte) {
            case 0:
                return "ID";
            case 1:
                return "Sorte";
            case 2:
            	return "Art";
            case 3:
            	return "Herkunft";
            case 4:
            	return "Farbe";
            case 5:
            	return "Reifezeit";
            case 6: 
            	return "Schaerfegrad";
            case 7:
            	return "Ertrag";
            default:
                return "DEFAULT";
        }
    }

	@Override
	public Object getValueAt(int zeilenIndex, int spaltenIndex) {
		
		if((zeilenIndex >= startPosition) && (zeilenIndex < (startPosition+100))){
			/* Wenn die Zeile in dem vorher definierten Bereich liegt (standart ist 0-100)
			 * dann tuhe nix!
			 */
			
		}else {
			
			/*
			 * Falls die ausgewaehlte Zeile drueber liegt dan wird der Bereich neu gesetzt
			 * und die jeweiligen Items in diesem neuen bereich gehohlt
			 */
			this.pflanzenListe = getItems(zeilenIndex,zeilenIndex+100);
			this.startPosition = zeilenIndex;
		}
		
		Pflanze pflanze = pflanzenListe.get(zeilenIndex-startPosition);
		
		Object toReturn = null;
		
		switch(spaltenIndex){
		case 0:
			toReturn = pflanze.getPflanzenID();
			break;
		case 1:
			toReturn = pflanze.getSorte();
			break;
		case 2:
			// Die Art der Pflanze wird aus der Tabelle Art gehohlt
			Art art = pflanze.getArt();
			toReturn = art.getArt();
			break;	
		case 3:
			Herkunft herkunft = pflanze.getHerkunft();
			toReturn = herkunft.getLand();
			break;
		case 4:
			Farbe farbe = pflanze.getFarbe();
			toReturn = farbe.getFarbe();
			break;
		case 5:
			toReturn = pflanze.getReifezeit();
			break;
		case 6:
			Schaerfegrad schaerfegrad = pflanze.getSchaerfegrad();
			toReturn = schaerfegrad.getSchaerfegrad();
			break;
		case 7:
			toReturn = pflanze.getErtrag();
	
			break;
		default:
			toReturn = pflanze.getPflanzenID();
			
		}
		return toReturn;
	
	
	}
	
	/** 
	 * Hohlt alle Pflanzen in dem Angegebenen bereich aus der Tabelle
	 * und gibt diese in einer Liste zurück
	 * @param von
	 * @param bis
	 * @return Pflanzen Liste
	 */
	private List<Pflanze> getItems(int von, int bis) {
		System.out.println("Zugriff auf die Tabelle Pflanze");
		Query query = manager.createQuery("SELECT p FROM Pflanze p").setMaxResults(bis-von).setFirstResult(von);
		
		List<Pflanze> resultList = query.getResultList();
		return resultList;
	}


}
